import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;

public class Sys {
   //仓库
   private Student[] arr = {};

    //数组默认的初始化长度
    private int default_capability = 5;
    //线程安全的
    private  AtomicInteger ai=new AtomicInteger();

    //开发者账号
    private  String dev_name="developer";
    //开发者密码
    private  String dev_pwd="developer";

    public Sys(){
        //学号从1000开始
        ai.set(1000);

        Student s1 = new Student("张三", 19, '男', "12345678911", "123456");
        Student s2 = new Student("张三2", 16, '女', "12345678912", "123456");
        Student s3 = new Student("张三", 29, '男', "12345678913", "123456");
        Student s4 = new Student("张三4", 18, '女', "12345678914", "123456");
        Student s5 = new Student("张三5", 39, '男', "12345678915", "123456");
        this.add(s1);
        this.add(s2);
        this.add(s3);
        this.add(s4);
        this.add(s5);
    }
    //用来储存实际保存的学生人数
    private  int size;

    /**
     * 将学生添加到数组
     * @param student
     * @return
     */
    public boolean add(Student student){
        //判断数组是否到达容量的上线
        if (size +1>arr.length){
            //一旦size+1的值超过当前数组能够容量，则数组需要扩容
           int min=Math.min(size,default_capability);
           int capability;
           if (min<default_capability){
               capability=default_capability;
           }else{
               capability=size+(size >> 1);
           }
           Student[] newArr=new Student[capability];
           System.arraycopy(this.arr,0,newArr,0,size);
           this.arr=newArr;
        }
        //设置学号自增长

        student.setStuId(ai.getAndIncrement());
        arr[size++] = student;
        return true;
    }

    /**
     * 根据学生姓名查找学生信息
     * @param name
     * @return
     */
    public Student[] findByName(String name){
        int count = 0;
        //找出arr中有几个重名的学生
        for (int i=0;i<size;i++){
            Student student = arr[i];
            if (student.getName().equals(name)){
                count++;
            }
        }

        Student[] stuArr=new Student[count];
        int index=0;
        //找出重名的人 并且保存到新数组中
        for (int i=0;i<size;i++){
            Student student=arr[i];
            if (student.getName().equals(name)){
                stuArr[index++] = student;
            }
        }
        return stuArr;
    }

    /**
     * 根据学号删除学生
     * @param stuId
     * @return
     */
    public int removeById(int stuId){
        //根据学号在数组中遍历查找
        for (int i=0;i<size;i++){
            if (arr[i].getStuId()==stuId){
                //一旦找到了，说明从下标为i的位置出开始，下标为i+1起复制到下标为i的位置
                int count = size - i - 1;
                /*
                 * 参数1： 被复制的数组
                 * 参数2： 被复制的数组从哪个下标开始复制
                 * 参数3： 接收的复制元素的数组
                 * 参数4： 接收的数组从哪个下标开始接收
                 * 参数5： 被复制的数组中复制几个元素
                 * */
                System.arraycopy(arr,i+1,arr,i,count);
                size--;//arr数组中已存元素的总个数要减1
                arr[size] = null;//复制数组后，最后一个元素是多余
                return i;
            }
        }
        return -1;
    }

    /**
     * 查询所有的学生信息
     * @return
     */
    public Student[] findAll(){
        Student[] students = new Student[size];
        System.arraycopy(arr,0,students,0,size);
        return  students;
    }

    /**
     * 根据年龄排序
     * @return
     */
    public Student[] sortByAge(){
        //复制一个新数组来排序
        Student[] students = Arrays.copyOf(arr, size);
        //冒泡排序
        for (int i = 0; i < students.length - 1;i++) {
            for (int j = 0; j < students.length - 1 - i; j++) {
                Student t1 = students[j];
                Student t2 = students[j + 1];
                if (t1.getAge() > t2.getAge()) {
                    Student temp = t1;
                    students[j] = t2;
                    students[j + 1] = temp;
                }
            }
        }
        return students;
    }

    /**
     * 统计人数
     * @return
     */
    public int getCount(){
        return this.size;
    }

    /**
     * 根据电话查找学生
     * @param phone
     * @return
     */
    public Student findStudentByPhone(String phone){
        for (int i=0;i<size;i++){
            if (arr[i].getPhone().equals(phone)){
                return arr[i];
            }
        }
        return null;
    }

    /**
     * 验证用户名和密码是否存在
     * @param loginName 用户名
     * @param loginPwd 密码
     * @return 是否登陆成功
     */
    public String login(String loginName,String loginPwd){
        if (loginName.equals("developer") && loginPwd.equals("developer")) return "developer";

        if (this.arr !=null){
            for (int i=0;i<size;i++){
                //取出保存在数组中的每个学生对象
                Student stu=this.arr[i];
                if (stu.getPhone().equals(loginName) && stu.getPassword().equals(loginPwd)){
                    return stu.getName();
                }
            }
        }
        return null;
    }

}
